E) Const Member

Const after function
class Number{
public:
int GetNum(void){ return num; }
bool IsNotZero(void) const {
return num!=0;
}
private:
int num;
};
bool IsNotZero(void) const 에서 함수명 뒤에 const는 const 함수임을 선언해 준다.
해당 함수 내에서는 어떤 변수도 바꿀 수 없음(mutable은 예외-지역 변수)을 의미한다.

함수가 클래스 멤버인 경우에만 const 키워드를 함수 뒤에 삽입할 수 있으며,
해당 함수가 속한 개체의 멤버 변수를 변경할 수 없음을 의미한다.

const가 붙은 함수 내에서는 const가 붙지 않음 함수를 호출할 수 없다.

- 객체 내부 변수 변경 불가
- const 함수만 호출 가능
class Number{
public:
int GetNum(void){ return num; }
bool IsNotZero(void) const {
int r=GetNum(); // error; GetNum is non-const function
SetZero(); // can call, but can't change value
return num!=0;
}
void SetZero(void) const {
num=0; // error; can not change class value(member)
}
private:
int num;
};
reference를 반환하는 메서드에서 생성된 reference는 메서드(객체) 밖에서 사용될 수 있다.
따라서 const를 사용하지 않는 것이 좋다.
template <typename T>
class MyVector{
private:
std::vector<T> cont;
public:
// ...
T operator[](const std::size_T i) const {
return cont[i];
}
T& operator[](const std::size_t i){
return cont[i];
}
};
int main(void){
MyVector<double> v1={1, 2, 3};
double& a=v1[3];
std::cout<<a<<std::endl;
return 0;
}
위와 같이 코딩할 경우, 아래와 같다.
const int x;
int &y=x;
위는 올바르지 않은 표현으로 아래와 같이 사용해야 함
const int x;
const int& y=x;
혹은 반환 타입을 const로 명시하고 반환해야 함
class Person{
public:
std::string const& name_good(void) const; // right
std::string& name_evil(void) const; // wrong
// ...
};
void MyCode(Person const& p){
p.name_evil()="Igor"; // compilTime error ()
}